Skip to content

Redesign airdrop milestones for clarity (#1005)#1009

Merged
realproject7 merged 1 commit intomainfrom
feat/redesign-milestones
Apr 28, 2026
Merged

Redesign airdrop milestones for clarity (#1005)#1009
realproject7 merged 1 commit intomainfrom
feat/redesign-milestones

Conversation

@realproject7
Copy link
Copy Markdown
Owner

Summary

Removes the dense SVG TimelineChart and 3-column StatsRow, replaces with a segmented progress bar + 4 milestone cards so users can grasp the airdrop stakes at a glance. Also deletes the now-unused MilestoneTrack component. Closes #1005.

Test plan

  • npm run typecheck passes
  • npm run lint passes (no new errors on CampaignHero.tsx)
  • Test mode (NEXT_PUBLIC_AIRDROP_MODE=test): cards show $7K / $10K / $35K / $50K with no CMC line
  • Prod mode: cards show $1M / $10M / $50M / $100M with ~#1900 / ~#950 / ~#400 / ~#250 CMC ranks
  • Burn % per card: 90% / 70% / 50% / 0%
  • Reached milestone cards: accent border + ✓ check
  • Future cards: dimmed at ~50% opacity
  • Segmented progress bar: reaching Bronze fills first segment to 100%, current FDV indicator appears under the active partial segment
  • Mobile (≤640px): cards in 2x2 grid; Desktop: 4 cards in a row
  • Lock-up proof link from Airdrop: change lock-up proof link to basescan tx #1003 still works above the cards
  • Visual regression: trigger Update Visual Snapshots workflow if the operator wants snapshots refreshed (per CLAUDE.md, this is manual)

Notes for reviewers

  • CMC rank is a static lookup table per tier (issue specified the values). It is gated by process.env.NEXT_PUBLIC_AIRDROP_MODE !== "test", so this is build-time inlined and works for both client and server-rendered runs.
  • The segmented bar's per-segment lower bound is bronze.fdv / 10 for the first segment and the previous tier's FDV thereafter. This was the simplest mapping that makes "Pre-Bronze" non-zero progress feel proportional without inventing a new data field.

🤖 Generated with Claude Code

Replace the dense SVG TimelineChart and 3-column StatsRow with a
4-segment progress bar plus 4 milestone cards, so users can read the
"reach milestones or it burns" stakes at a glance.

- CampaignHero: drop TimelineChart (hard-to-parse log/linear/projection
  overlay) and StatsRow (info absorbed into the new layout).
- New SegmentedProgressBar: 4 equal segments, log-scale fill within
  each, so reaching Bronze visibly fills 25% instead of looking like 1%
  on a Diamond-anchored bar. Indicator on the active segment.
- New MilestoneCard: tier emoji + label, FDV target, CMC rank
  (prod-only), unlock %, PLOT amount, pool USD, burn %. Reached cards
  get an accent border + check; future cards dim.
- All values come from the API milestones (config-driven, test/prod).
- Responsive: 2x2 mobile, 4-column desktop.
- Delete MilestoneTrack.tsx (unused after CampaignHero owns the layout).

Bumps to 1.3.0 (feature).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 28, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
plotlink Ignored Ignored Apr 28, 2026 0:31am

Request Review

Copy link
Copy Markdown
Owner Author

@realproject7 realproject7 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RE2 review: LGTM (chat approval posted; --approve blocked since PR is from same account). Contingent on e2e finishing green.

Walked through CampaignHero.tsx line-by-line against issue #1005 AC:

AC verified:

  • SVG chart removed; MilestoneTrack.tsx deleted (verified no remaining importers via grep -rn MilestoneTrack src/ lib/).
  • StatsRow removed.
  • SegmentedProgressBar (CampaignHero.tsx:116-183): 4 segments, log-scale fill via lowerFdv = i===0 ? t.fdv/10 : tiers[i-1].fdv so reaching Bronze visibly fills the first segment.
  • Current-FDV indicator: triangle + "Current: $X" under the active partial segment, gated on currentFdv > 0. No Math.log10 of 0/negative since the fill branch only runs when currentFdv > lowerFdv > 0.
  • MilestoneCard (CampaignHero.tsx:187-253): FDV / CMC (prod-only) / Unlock % / PLOT amount / Pool USD / Burn %.
  • CMC gated by IS_PROD_MODE = process.env.NEXT_PUBLIC_AIRDROP_MODE !== "test" — build-time inlined on client by Next, correct.
  • Burn % = 100 - tier.pct (90/70/50/0% for prod, same shape for test).
  • Visual states: reached → border-accent + ✓; current target → border-border; future → border-border opacity-50. Matches issue spec.
  • Responsive grid: grid-cols-2 sm:grid-cols-4.
  • Tier values from API (buildTiers(data.milestones)); test config respected automatically (#1004 already merged).
  • A11y: aria labels on segments, ✓ checkmark labelled, indicator triangle aria-hidden.

Other:

  • Version bump 1.2.2 → 1.3.0 (2nd-digit feature) per CLAUDE.md.
  • package-lock.json synced proactively (1.3.0 in both root + packages[""]).
  • Lock-up proof block from #1003 preserved unchanged (CampaignHero.tsx:292-306).
  • data-state attribute on cards (reached/current/future) is a nice testing hook.
  • Edge cases: all-reached → no indicator; pre-Bronze with currentFdv=0 → indicator text suppressed.

CI: lint-and-typecheck SUCCESS, Vercel preview SUCCESS, e2e IN_PROGRESS at time of review.

Operator note (not blocking): Per CLAUDE.md, visual snapshot updates are manual-only — recommend running gh workflow run update-snapshots.yml after merge to refresh snapshots for this UI change.

Approving from RE2.

Copy link
Copy Markdown
Collaborator

@project7-interns project7-interns left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE

Summary

The PR satisfies #1005: the dense SVG chart and stats row are removed, the replacement segmented progress bar and milestone cards cover the milestone, burn, CMC, unlock, PLOT, and pool-value information, and the values are driven from the config-backed milestone API.

Findings

  • None.

Decision

Approved. package.json and package-lock.json are both synced to 1.3.0, the #1003 lock-up proof link remains intact, and CI is green for lint/typecheck and e2e.

@realproject7 realproject7 merged commit 72a44d6 into main Apr 28, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Airdrop: remove chart, redesign milestones for clarity

2 participants